/********************************** (C) COPYRIGHT *******************************
* File Name          : foc.h
* Author             : nx666
* Version            : V1.0.0
* Date               : 2023/03/6
* Description        : foc主要接口在这里声明接口.
*******************************************************************************/
#ifndef __FOC_H
#define __FOC_H

#ifdef __cplusplus
extern "C" {
#endif

#include "common_type.h"
#include "module_config.h"
#include "driver.h"
#include "sampling.h"
#include "IQmathLib.h"
#include "smo.h"
#include "pid.h"
/**********************************宏定义区******************************/


/******************************* *类型定义区******************************/

typedef enum {
    OPEN_LOOP = 1,
    CLOSE_LOOP,
    FOC_STATUS_NUM,
}focStatus_;

//clarke变换的系数为2x3的矩阵
typedef struct clarkeMat
{
    _iq  mat00;
    _iq  mat01;
    _iq  mat02;
    _iq  mat10;
    _iq  mat11;
    _iq  mat12;
}clarkeMat_;

typedef struct focParam
{
    _iq      Ud_w;           //d-q坐标系 目标ud
    _iq      Uq_w;           //d-q坐标系 目标uq
    _iq      Omega_w;        //每个foc调整周期期望转动的电角度，单位 弧度，即角速度
    _iq      Theta;          //smo预测的当前角度
    _iq      Ialpha;         //实际 alpha-beta 轴电流
    _iq      Ibeta;          //实际 alpha-beta 轴电流
    _iq      Id;             //实际 d-q 轴电流
    _iq      Iq;             //实际 d-q 轴电流
    _iq      Id_w;           //目标 d-q 轴电流
    _iq      Iq_w;           //目标 d-q 轴电流
}focParam_;

typedef struct foc{
    pwm_             *pwm;
    tim_             *tim;
    sampling_        *sampling;
    // smo_             *smo;
    pll_             *pll;
    pid_             *pidId;
    pid_             *pidIq;
    clarkeMat_       clarkeMat;
    focParam_        param;
    focStatus_       status;
    

/* foc输出的计算结果  --start */
    _iq8 clac_Ualpha;
    _iq8 clac_Ubeta;
    _iq8 calc_Ua;                
    _iq8 calc_Ub;
    _iq8 calc_Uc;
    int calc_sector;
/* foc参数  --end */

/* foc 操作函数区 -- start*/
    Int (*setUdUq)(struct foc *,_iq,_iq);
    Int (*setOmega)(struct foc *,_iq);
    void (*IaIbIcToIalphaIbeta)(struct foc *);
    void (*IalphaIbetaToIdIq)(struct foc *);
    Int  (*setStatus)(struct foc *,focStatus_);
    Int (*curruntLoop)(struct foc *);
    Int (*setIdIq)(struct foc *,_iq,_iq);
    Int (*setIq)(struct foc *,_iq);

/* foc 操作函数区 -- end*/
}foc_;

/********************************函数声明区******************************/

/*********************************************************************
 * @fn      foc_adcDmaIrq
 *
 * @brief   重实现adcDma中断处理
 *
 * @return  void
 *          
 */
void foc_adcDmaIrq(void);

/*********************************************************************
 * @fn      foc_timIrq
 *
 * @brief   重实现定时器中断处理
 *
 * @return  void
 *          
 */
void foc_timIrq(void);


/*********************************************************************
 * @fn      focCreate
 *
 * @brief   foc构造函数，
 *              void
 *
 * @return  FUNC_SOK，成功  FUNC_FAIL，失败
 *          
 */
foc_ * focCreate(void);

#ifdef __cplusplus
}
#endif

#endif /*__FOC_H */